package com.clear.observer.subject;

import com.clear.observer.observer.Observer;

import java.util.LinkedList;
import java.util.List;

/**
 * 具体的主题：被观察者
 */
public class WeatherStation implements Subject {

    private List<Observer> observers;
    // 温度
    private float temperature;
    // 湿度
    private float humidity;
    // 大气压
    private float pressure;

    public WeatherStation() {
        this.observers = new LinkedList<>();
    }

    /**
     * 注册观察者的能力
     */
    @Override
    public void registerObserver(Observer o) {
        observers.add(o);
    }

    /**
     * 删除一个具体的观察者
     */
    @Override
    public void removeObserver(Observer o) {
        observers.remove(o);
    }

    /**
     * 一旦发生了观察的行为，应该通知所有的观察者
     */
    @Override
    public void notifyObservers() {
        // 循环所有的观察者，通知其当前的气象信息
        for (Observer o : observers) {
            o.update(temperature, humidity, pressure);
        }
    }

    // 修改气象内容
    public void measurementsChanged() {
        notifyObservers();
    }

    // 当测量值发生了变化的时候
    public void setMeasurements(float temperature, float humidity, float pressure) {
        this.temperature = temperature;
        this.humidity = humidity;
        this.pressure = pressure;
        // 测量值发生了变化，通知观察者
        measurementsChanged();
    }
}
